package com.my.lucky.service;

import com.my.lucky.entity.SysInfo;
import com.my.lucky.model.ReviewInfo;
import com.my.lucky.repository.ReviewInfoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 复盘信息服务类
 */
@Service
public class ReviewInfoService {

    private final ReviewInfoRepository reviewInfoRepository;

    // 构造函数注入
    @Autowired
    public ReviewInfoService(ReviewInfoRepository reviewInfoRepository) {
        this.reviewInfoRepository = reviewInfoRepository;
    }

    /**
     * 保存复盘信息
     *
     * @param reviewTime    复盘时间
     * @param reviewContent 复盘内容
     * @return 保存后的复盘信息对象（包含自增ID）
     */
    @Transactional
    public ReviewInfo saveReviewInfo(LocalDate reviewTime, String reviewContent) {
        // 创建实体对象
        ReviewInfo reviewInfo = new ReviewInfo();
        reviewInfo.setReviewTime(reviewTime);
        reviewInfo.setReviewContent(reviewContent);
        // 保存到数据库
        return reviewInfoRepository.save(reviewInfo);
    }

    // 核心：根据ReviewTime全量更新（替换所有字段）
    @Transactional
    public ReviewInfo updateByReviewTime(
            LocalDate oldReviewTime,  // 用于定位记录的旧时间
            LocalDate newReviewTime,  // 新的复盘时间
            String newContent) {          // 新的复盘内容

        // 1. 根据旧时间查询记录
        ReviewInfo existing = reviewInfoRepository.findByReviewTime(oldReviewTime)
                .orElseThrow(() -> new RuntimeException("未找到复盘时间为：" + oldReviewTime + " 的记录"));

        // 2. 全量替换字段（包括时间和内容）
        existing.setReviewTime(newReviewTime);  // 更新时间
        existing.setReviewContent(newContent);        // 更新内容

        // 3. 保存更新（JPA会自动执行UPDATE）
        return reviewInfoRepository.save(existing);
    }

    /**
     * 根据reviewTime进行更新或新增操作
     * 如果存在该日期的记录则更新，不存在则创建新记录
     * @param reviewInfo 包含reviewTime和要更新/保存的字段的实体
     * @return 操作后的实体
     */
    @Transactional
    public ReviewInfo upsertByReviewTime(ReviewInfo reviewInfo) {
        // 检查是否存在该日期的记录
        return reviewInfoRepository.findByReviewTime(reviewInfo.getReviewTime())
                .map(existing -> {
                    // 如果存在，更新字段
                    existing.setReviewContent(reviewInfo.getReviewContent());
                    existing.setUpdateTime(reviewInfo.getUpdateTime());
                    if (reviewInfo.getReviewGainian()!=null && !reviewInfo.getReviewGainian().trim().isEmpty()) {
                        existing.setReviewGainian(reviewInfo.getReviewGainian());
                    }
//                    existing.setReviewStock(reviewInfo.getReviewStock());
                    // 注意：这里不更新reviewTime，因为我们是根据它来查询的
                    return reviewInfoRepository.save(existing);
                })
                .orElseGet(() -> {
                    // 如果不存在，创建新记录
                    return reviewInfoRepository.save(reviewInfo);
                });
    }


    /**
     * 根据reviewTime进行更新或新增操作
     * 如果存在该日期的记录则补充字段内容，不存在则创建新记录
     * 补充逻辑：将新内容追加到原有内容之后，使用换行符分隔
     * @param reviewInfo 包含reviewTime和要更新/保存的字段的实体
     * @return 操作后的实体
     */
    @Transactional
    public ReviewInfo upsertByReview(ReviewInfo reviewInfo) {
        // 检查是否存在该日期的记录
        return reviewInfoRepository.findByReviewTime(reviewInfo.getReviewTime())
                .map(existing -> {
                    // 补充reviewContent：原有内容 + 换行 + 新内容（处理空值）
                    String existingContent = existing.getReviewContent();
                    String newContent = reviewInfo.getReviewContent();
                    if (newContent != null) { // 只有新内容不为空时才补充
                        existing.setReviewContent(mergeContent(existingContent, newContent));
                    }

                    existing.setUpdateTime(reviewInfo.getUpdateTime());
                    // 补充reviewGainian
                    String existingGainian = existing.getReviewGainian();
                    String newGainian = reviewInfo.getReviewGainian();
                    if (newGainian != null) {
                        existing.setReviewGainian(mergeContent(existingGainian, newGainian));
                    }

                    // 补充reviewStock
                    String existingStock = existing.getReviewStock();
                    String newStock = reviewInfo.getReviewStock();
                    if (newStock != null) {
                        existing.setReviewStock(mergeContent(existingStock, newStock));
                    }
                    // 保存更新后的记录
                    return reviewInfoRepository.save(existing);
                })
                .orElseGet(() -> {
                    // 不存在则直接创建新记录
                    return reviewInfoRepository.save(reviewInfo);
                });
    }

    /**
     * 合并内容：将新内容追加到原有内容之后，使用换行符分隔
     * @param existing 原有内容（可能为null）
     * @param newContent 新内容（非null）
     * @return 合并后的内容
     */
    private String mergeContent(String existing, String newContent) {
        if (existing == null || existing.trim().isEmpty()) {
            // 原有内容为空，直接使用新内容
            return newContent;
        } else {
            // 原有内容非空，用换行分隔后追加新内容
            return existing + "," + newContent;
        }
    }


}
